package it.traveldream.ManagedBeans;

import it.traveldream.EJB.SBEJBBean;
import it.traveldream.EJB.DTO.TrasportoSingoloDTO;

import java.util.ArrayList;
import java.util.Iterator;

import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;


@ManagedBean(name="trasportoBean")
@SessionScoped
public class TrasportoBean {

	private TrasportoSingoloDTO newTrasporto;

	private TrasportoSingoloDTO trasportoSelezionato;

	private ArrayList<TrasportoSingoloDTO> listaTrasporti;

	private ArrayList<TrasportoSingoloDTO> listaTrasportiFiltrati;

	private TrasportoSingoloDTO datiFiltro;


	//Variabile necessaria per accedere ai dati del nuovo pacchetto che si vuole inserire
	@ManagedProperty(value="#{pacchettoBean}")
	private PacketBean packBean;

	@EJB
	private SBEJBBean sbEJB;


	public TrasportoBean(){

		listaTrasporti = new ArrayList<TrasportoSingoloDTO>();
		listaTrasportiFiltrati = new ArrayList<TrasportoSingoloDTO>();
		newTrasporto = new TrasportoSingoloDTO();
		setDatiFiltro(new TrasportoSingoloDTO());
	}



	/**
	 * 
	 * Metodo che permette di aggiungere un nuovo trasportoSingolo
	 */
	public void addTrasporto(){

		System.out.println("Trasporto - Managed Bean \n Dati nuovo trasporto: \n"+
				"Da: " + newTrasporto.getCittaPartenza().getName() + " a " + newTrasporto.getCittaArrivo().getName() +
				"\n data: " + newTrasporto.getDataAsString() + " \n prezzo: " + newTrasporto.getPrezzo() +
				"\n disponibilita: " + newTrasporto.getDisponibilita()
				);

		try {
			sbEJB.addTrasporto(newTrasporto);

			FacesContext.getCurrentInstance().addMessage("create_trasporto_growl",
					new FacesMessage( "SUCCESFULLY", "trasporto creato correttamente"));
			newTrasporto = new TrasportoSingoloDTO();	//Elimino i dati del trasporto appena inserito dai field del form di inserimento
		} catch (Exception e) {
			FacesContext.getCurrentInstance().addMessage("create_trasporto_growl",
					new FacesMessage( "ERRORE", e.getMessage().substring(0, e.getMessage().indexOf(":"))));
			System.out.print(e.getMessage());
		}
	}
	
	/**
	 * Metodo che permette di modificare i dati di un trasporto presente su DB
	 * con i dati contenunti nel {@link TrasportoSingoloDTO} trasportoSelezionato
	 */
	public void editTrasporto(){

		System.out.println("Trasporto - Managed Bean \n Dati nuovo trasporto: \n"+
				"Da: " + trasportoSelezionato.getCittaPartenza().getName() + " a " + trasportoSelezionato.getCittaArrivo().getName() +
				"\n data: " + trasportoSelezionato.getDataAsString() + " \n prezzo: " + trasportoSelezionato.getPrezzo() +
				"\n disponibilita: " + trasportoSelezionato.getDisponibilita()
				);

		try {
			sbEJB.updateTrasporto(trasportoSelezionato);

			FacesContext.getCurrentInstance().addMessage("edit_trasporto_growl",
					new FacesMessage( "SUCCESFULLY", "Trasporto modificato correttamente"));
			trasportoSelezionato = new TrasportoSingoloDTO();	//Elimino i dati del trasporto appena inserito dai field del form di inserimento
		} catch (Exception e) {
			FacesContext.getCurrentInstance().addMessage("edit_trasporto_growl",
					new FacesMessage( "ERRORE", e.getMessage().substring(0, e.getMessage().indexOf(":"))));
			System.out.print(e.getMessage());
		}
	}

	
	
	/**
	 * Metodo che permette di eliminare il trasporto singolo i cui dati si trovano nel
	 * {@link TrasportoSingoloDTO} trasportoSelezionato
	 * 
	 */
	public void deleteTrasporto(){
		
		try {

			sbEJB.deleteTrasporto(trasportoSelezionato);
			
			FacesContext.getCurrentInstance().addMessage("delete_trasporto_growl",
					new FacesMessage( "SUCCESFULLY", "Trasporto eliminato"));
			trasportoSelezionato = new TrasportoSingoloDTO();	//Elimino i dati del trasporto appena inserito dai field del form di inserimento
		} catch (Exception e) {
			FacesContext.getCurrentInstance().addMessage("delete_trasporto_growl",
					new FacesMessage( "ERRORE", e.getMessage().substring(0, e.getMessage().indexOf(":"))));
			
			System.out.println(e.getMessage().substring(0, e.getMessage().indexOf(":")));
		}
		
		
	}

	/**
	 * 
	 * Metodo che carica i dati dei trasporti dal DB: i dati sono poi filtrati dal 
	 * metodo {@code filtraTrasporti}.
	 * 
	 */
	public void caricaTrasporti(){
		if( !FacesContext.getCurrentInstance().isPostback()){
			datiFiltro = new TrasportoSingoloDTO();
			System.out.println("Carico i trasporti dal DB");
			listaTrasporti.clear();
			listaTrasporti.addAll(sbEJB.getTrasporti());
			listaTrasportiFiltrati.clear();
			listaTrasportiFiltrati.addAll(listaTrasporti);
			datiFiltro.setDisponibilita(-1);

			HttpServletRequest origRequest = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();

			if(origRequest.getServletPath().contains("new_packet_trasporti_andata")){
				System.out.println(origRequest.getServletPath().contains("new_packet_trasporti_andata") +" Filtro personal andata");
				this.datiFiltro.setData(packBean.getNuovoPacchetto().getdataPartenza());
				this.datiFiltro.setCittaArrivo(packBean.getNuovoPacchetto().getCitta());
				//Filtro i trasporti in modo che sui voli di andata e ritorno ci siano (#pacchetti disponibilii * #personexpacchetto) posti
				this.datiFiltro.setDisponibilita(packBean.getNumeroPersNuovoPacchetto() * packBean.getNuovoPacchetto().getDisponibilita());
			}

			if(origRequest.getServletPath().contains("new_packet_trasporti_ritorno")){
				System.out.println(origRequest.getServletPath().contains("new_packet_trasporti_ritorno")+ " Filtro personal ritorno");

				this.datiFiltro.setData(packBean.getNuovoPacchetto().getdataRitorno());
				this.datiFiltro.setCittaPartenza(packBean.getNuovoPacchetto().getTrasportAndata().getCittaArrivo());
				this.datiFiltro.setCittaArrivo(packBean.getNuovoPacchetto().getTrasportAndata().getCittaPartenza());
				//Filtro i trasporti in modo che sui voli di andata e ritorno ci siano (#pacchetti disponibilii * #personexpacchetto) posti
				this.datiFiltro.setDisponibilita(packBean.getNumeroPersNuovoPacchetto() * packBean.getNuovoPacchetto().getDisponibilita());
			}
			
			System.out.println(origRequest.getServletPath()+"  URL Trasporti FIltro");
			if(origRequest.getServletPath().contains("edit_packet_trasporti_andata")){
				System.out.println(origRequest.getServletPath().contains("edit_packet_trasporti_andata") +" Filtro personal andata EDIT");
				this.datiFiltro.setData(packBean.getPacchettoSelezionato().getdataPartenza());
				this.datiFiltro.setCittaArrivo(packBean.getPacchettoSelezionato().getCitta());
				
				//Filtro i trasporti in modo che sui voli di andata e ritorno ci siano (#pacchetti disponibilii * #personexpacchetto) posti
				this.datiFiltro.setDisponibilita(packBean.getNumeroPersNuovoPacchetto() * packBean.getNuovoPacchetto().getDisponibilita());
			}

			if(origRequest.getServletPath().contains("edit_packet_trasporti_ritorno")){
				System.out.println(origRequest.getServletPath().contains("edit_packet_trasporti_ritorno")+ " Filtro personal ritorno EDIT");

				this.datiFiltro.setData(packBean.getPacchettoSelezionato().getdataRitorno());
				this.datiFiltro.setCittaPartenza(packBean.getPacchettoSelezionato().getTrasportAndata().getCittaArrivo());
				//Filtro i trasporti in modo che sui voli di andata e ritorno ci siano (#pacchetti disponibilii * #personexpacchetto) posti
				this.datiFiltro.setDisponibilita(packBean.getNumeroPersNuovoPacchetto() * packBean.getPacchettoSelezionato().getDisponibilita());
			}
			
			filtraTrasporti();
		}



	}

	
	/**
	 * parte client
	 * Metodo che carica i dati dei trasporti per l'anadata dal DB: i dati sono poi filtrati dal 
	 * 
	 * metodo {@code filtraTrasporti}.
	 * 
	 */
	public void caricaTrasportiAndataCustom(){
		
			datiFiltro = new TrasportoSingoloDTO();
			System.out.println("Carico i trasporti dal DB");
			listaTrasporti.clear();
			listaTrasporti.addAll(sbEJB.getTrasporti());
			listaTrasportiFiltrati.clear();
			listaTrasportiFiltrati.addAll(listaTrasporti);
			datiFiltro.setDisponibilita(-1);

			HttpServletRequest origRequest = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();

			if(origRequest.getServletPath().contains("custom_packet")){
				System.out.println(origRequest.getServletPath().contains("new_packet_trasporti_andata") +" Filtro personal andata");
				this.datiFiltro.setData(packBean.getNuovoPacchetto().getdataPartenza());
				this.datiFiltro.setCittaArrivo(packBean.getNuovoPacchetto().getCitta());
				//Filtro i trasporti in modo che sui voli di andata e ritorno ci siano (#pacchetti disponibilii * #personexpacchetto) posti
				this.datiFiltro.setDisponibilita(packBean.getNumeroPersNuovoPacchetto() * packBean.getNuovoPacchetto().getDisponibilita());
			}
			
			if(origRequest.getServletPath().contains("new_packet_trasporti_andata")){
				System.out.println(origRequest.getServletPath().contains("new_packet_trasporti_andata") +" Filtro personal andata");
				this.datiFiltro.setData(packBean.getNuovoPacchetto().getdataPartenza());
				this.datiFiltro.setCittaArrivo(packBean.getNuovoPacchetto().getCitta());
				//Filtro i trasporti in modo che sui voli di andata e ritorno ci siano (#pacchetti disponibilii * #personexpacchetto) posti
				this.datiFiltro.setDisponibilita(packBean.getNumeroPersNuovoPacchetto() * packBean.getNuovoPacchetto().getDisponibilita());
			}
			
			filtraTrasporti();
		



	}
	
	
	/**
	 * parte client
	 * Metodo che carica i dati dei trasporti per il ritorno dal DB: i dati sono poi filtrati dal 
	 * 
	 * metodo {@code filtraTrasporti}.
	 * 
	 */
	public void caricaTrasportiRitornoCustom(){
		
			datiFiltro = new TrasportoSingoloDTO();
			System.out.println("Carico i trasporti dal DB");
			listaTrasporti.clear();
			listaTrasporti.addAll(sbEJB.getTrasporti());
			listaTrasportiFiltrati.clear();
			listaTrasportiFiltrati.addAll(listaTrasporti);
			datiFiltro.setDisponibilita(-1);

			HttpServletRequest origRequest = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();

			
			if(origRequest.getServletPath().contains("new_packet_trasporti_andata")){
				System.out.println(origRequest.getServletPath().contains("new_packet_trasporti_ritorno")+ " Filtro personal ritorno");

				this.datiFiltro.setData(packBean.getNuovoPacchetto().getdataRitorno());
				this.datiFiltro.setCittaPartenza(packBean.getNuovoPacchetto().getTrasportAndata().getCittaArrivo());
				//Filtro i trasporti in modo che sui voli di andata e ritorno ci siano (#pacchetti disponibilii * #personexpacchetto) posti
				this.datiFiltro.setDisponibilita(packBean.getNumeroPersNuovoPacchetto() * packBean.getNuovoPacchetto().getDisponibilita());
			}
			if(origRequest.getServletPath().contains("new_packet_trasporti_ritorno")){
				System.out.println(origRequest.getServletPath().contains("new_packet_trasporti_ritorno")+ " Filtro personal ritorno");

				this.datiFiltro.setData(packBean.getNuovoPacchetto().getdataRitorno());
				this.datiFiltro.setCittaPartenza(packBean.getNuovoPacchetto().getTrasportAndata().getCittaArrivo());
				//Filtro i trasporti in modo che sui voli di andata e ritorno ci siano (#pacchetti disponibilii * #personexpacchetto) posti
				this.datiFiltro.setDisponibilita(packBean.getNumeroPersNuovoPacchetto() * packBean.getNuovoPacchetto().getDisponibilita());
			}
			
			
			filtraTrasporti();
		



	}
	
	

	/*
	 * Metodo che gestisce l'onRowSelect sulla tabella dei 
	 * servizi base
	 */

	public void onTrasportoRowSelect(){
		System.out.print("Selezionato trasporto base: " + trasportoSelezionato.getIdTrasporto() +
				"  " + trasportoSelezionato.getDataAsString() +" "+
				trasportoSelezionato.getCittaPartenza() + "  " + trasportoSelezionato.getCittaArrivo());
	}


	/**
	 * Metodo utilizzato per filtrare la lista dei trasporti
	 * 
	 * @param query
	 */
	public void filtraTrasporti(){

		ArrayList<TrasportoSingoloDTO> listaFiltrata = new ArrayList<TrasportoSingoloDTO>();
		listaTrasporti.clear();
		listaTrasporti.addAll(sbEJB.getTrasporti());
		listaTrasportiFiltrati.clear();
		listaTrasportiFiltrati.addAll(listaTrasporti);
		Iterator<TrasportoSingoloDTO> it = listaTrasportiFiltrati.iterator();
		TrasportoSingoloDTO help;

		System.out.print("Dati Filtro Trasporti: " + datiFiltro.getDataAsString() + "  " +
				(datiFiltro.getCittaArrivo()== null ? "null" :  datiFiltro.getCittaArrivo().getName()) +
				"  " + (datiFiltro.getCittaPartenza()== null ? "null" : datiFiltro.getCittaPartenza().getName()));

		//Filtro per città di partenza
		if(datiFiltro.getCittaPartenza() != null){
			while(it.hasNext()){
				help = it.next();
				if(help.getCittaPartenza().getId() == datiFiltro.getCittaPartenza().getId()){
					listaFiltrata.add(help);
				}
			}
			listaTrasportiFiltrati.clear();
			listaTrasportiFiltrati.addAll(listaFiltrata);
		}

		//Filtro per citta di arrivo
		if(datiFiltro.getCittaArrivo() != null){
			listaFiltrata.clear();
			it = listaTrasportiFiltrati.iterator();
			//svuoto la "vecchia" lista dei trasporti filtrati
			while(it.hasNext()){
				help = it.next();
				if(help.getCittaArrivo().getId() == datiFiltro.getCittaArrivo().getId())
					listaFiltrata.add(help);
			}
			listaTrasportiFiltrati.clear();
			listaTrasportiFiltrati.addAll(listaFiltrata);
		}

		//Filtro per data del trasporto
		if(datiFiltro.getData() != null){
			it = listaTrasportiFiltrati.iterator();
			listaFiltrata.clear();		//svuoto la "vecchia" lista dei trasporti filtrati
			while(it.hasNext()){
				help = it.next();
				if(help.getData().compareTo(datiFiltro.getData()) == 0)
					listaFiltrata.add(help);
			}
			listaTrasportiFiltrati.clear();
			listaTrasportiFiltrati.addAll(listaFiltrata);
		}

		//Filtro per data del trasporto
		if(datiFiltro.getDisponibilita() > 0 ){
			it = listaTrasportiFiltrati.iterator();
			listaFiltrata.clear();		//svuoto la "vecchia" lista dei trasporti filtrati
			while(it.hasNext()){
				help = it.next();
				if(help.getDisponibilita() >= datiFiltro.getDisponibilita())
					listaFiltrata.add(help);
			}
			listaTrasportiFiltrati.clear();
			listaTrasportiFiltrati.addAll(listaFiltrata);
		}
	}


	public TrasportoSingoloDTO getNewTrasporto() {
		return newTrasporto;
	}



	public void setNewTrasporto(TrasportoSingoloDTO newTrasporto) {
		this.newTrasporto = newTrasporto;
	}



	public TrasportoSingoloDTO getTrasportoSelezionato() {
		return trasportoSelezionato;
	}



	public void setTrasportoSelezionato(TrasportoSingoloDTO trasportoSelezionato) {
		this.trasportoSelezionato = trasportoSelezionato;
	}



	public ArrayList<TrasportoSingoloDTO> getListaTrasportiFiltrati() {
		return listaTrasportiFiltrati;
	}



	public void setListaTrasportiFiltrati(
			ArrayList<TrasportoSingoloDTO> listaTrasportiFiltrati) {
		this.listaTrasportiFiltrati = listaTrasportiFiltrati;
	}



	public TrasportoSingoloDTO getDatiFiltro() {
		return datiFiltro;
	}



	public void setDatiFiltro(TrasportoSingoloDTO datiFiltro) {
		this.datiFiltro = datiFiltro;
	}



	public PacketBean getPackBean() {
		return packBean;
	}



	public void setPackBean(PacketBean packBean) {
		this.packBean = packBean;
	}

}
